package com.hqyj.javaSpringBoot.modules.test.dao;

import com.hqyj.javaSpringBoot.modules.test.entity.Country;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Repository;

import java.util.List;

//mapper： 直接扫描Dao层文件 spring将动态的生成Bean后注入到ServiceImpl中。不用写Mapper映射文件
//@Repository 用在持久层的接口上，这个注解是将接口的一个实现类交给spring管理。
//@Results的基本用法。当数据库字段名与实体类对应的属性名不一致时，可以使用@Results映射来将其对应起来。
// column为数据库字段名，
// porperty为实体类属性名，
// jdbcType为数据库字段数据类型，
// id为是否为主键。
//设置@Results id 可用@ResultMap(value="id")重复引用这段代码
@Mapper
@Repository
public interface CountryDao {

    //@One 当我们需要通过查询到的一个字段值作为参数，去执行另外一个方法来查询关联的内容，而且两者是一对一关系时，可以使用@One注解来便捷的实现。
    //@Many 与One相似 是确定一对多关系
    @Select("select * from test_country where country_id = #{countryId}")
    @Results(id="countryResults", value = {
            @Result(column = "country_id", property = "countryId"),
            @Result(column = "country_id",
                    property = "cities",
                    javaType = List.class,
                    many = @Many(select="com.hqyj.javaSpringBoot.modules.test.dao.CityDao.getCitiesByCountryId")
            )
    })
    Country getCountryByCountryId(int countryId);

    @Select("select * from test_country where country_name = #{countryName} " +
            "and local_country_name = #{localCountryName}")
    @ResultMap(value="countryResults")
    //@Param("countryName") 使sql语句中#{countryName}的值对应注解处的参数countryName;
    // 不使用@Param注解时，最好传递 Javabean。在SQL语句里就可以直接引用JavaBean的属性，而且只能引用JavaBean存在的属性。
    Country getCountryByCountryName(@Param("countryName") String countryName,
                                    @Param("localCountryName") String localCountryName);
}
